home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 2 / Meeting Pearls Vol. II (1995)(GTI - Schatztruhe)[!].iso / Pearls / dev / Oberon4Amiga / Dialogs / DialogRadioButtons.Mod (.txt) < prev    next >
Oberon Text  |  1994-11-28  |  6KB  |  150 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. StampElems
  4. Alloc
  5. 25 Oct 94
  6. Syntax10b.Scn.Fnt
  7. MODULE DialogRadioButtons;
  8.     (** Markus Knasm
  9. ller 30 Jun 94 -  
  10. IMPORT DialogFrames, DialogGroupBoxes, Dialogs, DialogTexts, Display, Display1, In, Input, Oberon, Printer, TextFrames, Texts, Viewers;
  11.     CONST ML = 0; MM = 1; MR = 2;  W* = 20; H* = W; grey1 = 12; grey2 = 13; grey3 = 14; black = 15; white = 0; p = 5;
  12.     TYPE 
  13.         Item* = POINTER TO ItemDesc;
  14.         ItemDesc* = RECORD(Dialogs.ObjectDesc)
  15.             on-: BOOLEAN; (** state of the radiobutton *)
  16.         END;
  17.     VAR w: Texts.Writer;
  18.     PROCEDURE Min (x, y: INTEGER): INTEGER;
  19.     BEGIN IF x < y THEN RETURN x ELSE RETURN y END
  20.     END Min;
  21.     PROCEDURE (r: Item) Draw* (x, y: INTEGER; f: Display.Frame);
  22.     (** displays the object at (x, y) in frame f *)
  23.         VAR mode, w, h, rx, ry, i, y1: INTEGER;
  24.     BEGIN
  25.         r.GetDim (rx, ry, w, h); DEC (w); DEC (h); w := Min (w, h);
  26.         IF r.selected THEN mode := Display.invert ELSE mode := Display.replace END;
  27.         IF r.on THEN
  28.             Display1.Line (f, black, x, y + (w DIV 2), x + (w DIV 2), y + w, mode);
  29.             Display1.Line (f, black, x + w, y + (w DIV 2), x + (w DIV 2), y + w, mode);
  30.             Display1.Line (f, white, x, y + (w DIV 2), x + (w DIV 2), y, mode);
  31.             Display1.Line (f, white, x + w, y + (w DIV 2), x + (w DIV 2), y, mode);
  32.             FOR  i := - ((w * p) DIV 20) TO 0 DO
  33.                 y1 := y + (w DIV 2) + (w * p DIV 20) + i;
  34.                 Display1.Line (f, black, x + (w DIV 2) + i, y1, x + (w DIV 2) - i, y1, mode); 
  35.             END;
  36.             FOR  i := 0 TO ((w * p) DIV 20) DO
  37.                 y1 := y + (w DIV 2) - i;
  38.                 Display1.Line (f, black, x + (w DIV 2) - (w * p DIV 20) + i, y1, x + (w DIV 2)  + (w * p DIV 20) - i, y1, mode); 
  39.             END;
  40.         ELSE
  41.             Display1.Line (f, white, x, y + (w DIV 2), x + (w DIV 2), y + w, mode);
  42.             Display1.Line (f, white, x + w, y + (w DIV 2), x + (w DIV 2), y + w, mode);
  43.             Display1.Line (f, black, x, y + (w DIV 2), x + (w DIV 2), y, mode);
  44.             Display1.Line (f, black, x + w, y + (w DIV 2), x + (w DIV 2), y, mode)
  45.         END
  46.     END Draw;
  47.     PROCEDURE (r: Item) Print* (x, y: INTEGER);
  48.     (** prints the object at printer coordinates (x, y) *)
  49.         VAR w, h, rx, ry, i, y1: INTEGER;
  50.     BEGIN
  51.         r.GetPDim (rx, ry, w, h); DEC (w); DEC (h); w := Min (w, h);
  52.         Printer.Line (x + w, y + (w DIV 2), x + (w DIV 2), y + w);
  53.         Printer.Line (x + w, y + (w DIV 2), x + (w DIV 2), y);
  54.         Printer.Line (x, y + (w DIV 2), x + (w DIV 2), y + w);
  55.         Printer.Line (x, y + (w DIV 2), x + (w DIV 2), y);
  56.         IF r.on THEN
  57.             FOR  i := - ((w * p) DIV 20) TO 0 DO
  58.                 y1 := y + (w DIV 2) + (w * p DIV 20) + i;
  59.                 Printer.Line (x + (w DIV 2) + i, y1, x + (w DIV 2) - i, y1); 
  60.             END;
  61.             FOR  i := 0 TO ((w * p) DIV 20) DO
  62.                 y1 := y + (w DIV 2) - i;
  63.                 Printer.Line (x + (w DIV 2) - (w * p DIV 20) + i, y1, x + (w DIV 2)  + (w * p DIV 20) - i, y1); 
  64.             END;
  65.         END
  66.     END Print;
  67.     PROCEDURE (r: Item) Copy* (VAR dup: Dialogs.Object);
  68.     (** allocates dup and makes a deep copy of o. Before calling this methode dup should be equal NIL *)
  69.         VAR x: Item;
  70.     BEGIN
  71.         IF dup = NIL THEN NEW (x); dup := x ELSE x := dup(Item) END; 
  72.         r.Copy^ (dup); x.on := r.on;
  73.     END Copy;
  74.     PROCEDURE (r: Item) ChangeValue* (value: BOOLEAN);
  75.     (** changes the state of the item *)
  76.         VAR g, o: Dialogs.Object; obArray: ARRAY 50 OF Dialogs.Object; nofelems, i: INTEGER;
  77.     BEGIN
  78.         IF r.on THEN RETURN END;  (* one button of a set is on at any time *)
  79.         r.on := value; r.Restore;
  80.         IF value = FALSE THEN RETURN END;
  81.         g := r.OverlappingObject (); IF g = NIL THEN RETURN END;
  82.         WITH g: DialogGroupBoxes.Item DO
  83.             g.GetObjects (obArray, nofelems);
  84.             FOR i := 0 TO nofelems - 1 DO
  85.                 o := obArray[i];
  86.                 IF o # r THEN
  87.                     WITH o: Item DO
  88.                         IF o.on THEN o.Hide; o.on := FALSE; o.Restore END
  89.                     ELSE
  90.                     END
  91.                 END
  92.             END
  93.             ELSE
  94.         END
  95.     END ChangeValue;
  96.     PROCEDURE (r: Item) Track (x, y: INTEGER; keys: SET; f: Display.Frame; p: Dialogs.Panel);
  97.         VAR keysum: SET; name: ARRAY 64 OF CHAR; dummy: ARRAY 6 OF CHAR; t: Texts.Text;
  98.     BEGIN
  99.         IF (keys = {ML}) OR (keys = {MM}) OR (keys = {MR}) THEN keysum := keys;
  100.             REPEAT Input.Mouse(keys, x, y); keysum := keysum + keys;
  101.                 Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, x, y)
  102.             UNTIL keys = {};
  103.             IF (keysum = {ML}) OR (keysum = {MM}) OR (keysum = {MR}) THEN 
  104.                 r.ChangeValue (~ r.on); 
  105.                 IF r.cmd[0] # 0X THEN
  106.                     DialogTexts.GetParText (r.par, r.panel, t);
  107.                     r.CallCmd (f, Viewers.This (x, y), t)
  108.                 END
  109.             END
  110.         ELSE Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, x, y)
  111.         END
  112.     END Track;
  113.     PROCEDURE (r: Item) Handle* (f: Display.Frame; VAR m: Display.FrameMsg);
  114.     (** handles messages which were sent to frame f *)
  115.     BEGIN
  116.         r.Handle^ (f, m);
  117.         WITH f: DialogFrames.Frame DO
  118.             WITH m: Oberon.InputMsg DO
  119.                 IF m.id = Oberon.track THEN r.Track (m.X, m.Y, m.keys, f, f.panel) END
  120.             ELSE
  121.             END
  122.         ELSE
  123.         END
  124.     END Handle;
  125.     PROCEDURE Insert*;
  126.     (** Insert ([name] [x y w h] | ^ ) inserts a radiobutton - item in the panel containing the caret position *)
  127.         VAR x, y, x1, y1, w, h: INTEGER; r: Item; p: Dialogs.Panel; name: ARRAY 64 OF CHAR;
  128.     BEGIN 
  129.         NEW (r); 
  130.         DialogFrames.GetCaretPosition (p, x, y);
  131.         IF (p # NIL) THEN 
  132.             r.Init; r.on := FALSE; 
  133.             In.Open; In.Name (name);
  134.             IF ~In.Done THEN COPY ("", name); In.Open END;
  135.             r.SetName (name); 
  136.             In.Int (x1); In.Int (y1); In.Int (w); In.Int (h);
  137.             IF ~In.Done THEN x1 := x; y1 := y; w := W; h := H 
  138.             ELSE
  139.                 IF w < 0 THEN w := W END;
  140.                 IF h < 0 THEN h := H END
  141.             END;
  142.             r.SetDim (x1, y1, w, h, FALSE); p.Insert (r, FALSE);   
  143.         ELSE
  144.             Dialogs.res := Dialogs.noPanelSelected
  145.         END;
  146.         IF Dialogs.res # 0 THEN Dialogs.Error ("DialogRadioButtons") END;
  147.     END Insert;
  148. BEGIN Texts.OpenWriter (w);
  149. END DialogRadioButtons.
  150.